package controllers;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.Query;

import org.h2.constant.SysProperties;
import org.h2.message.DbException;

import models.GrauTarefaEnum;
import models.LogsTarefa;
import models.Projeto;
import models.ProjetosTarefasAtraso;
import models.StatusTarefaEnum;
import models.Tarefa;
import models.TipoTarefaEnum;
import models.TipoUsuarioEnum;
import models.Usuario;
import models.desempenhoFunc;
import play.db.DB;
import play.db.jpa.JPA;
import play.mvc.Controller;

public class Administracao extends Controller {

	private static Application ap = new Application();
	
	public static void tarefasConcluidas() throws SQLException {

		ap.verificarAutenticacao();
		
		String tipoUsuario = ap.checkAdmin();
		String user = ap.usuario();

		List<Tarefa> tarefas = new ArrayList<Tarefa>();

		javax.persistence.Query query = JPA.em().createQuery(
				"select t from Tarefa t where t.status = 'Concluido'");

		// u.id = t.usuario
		tarefas = query.getResultList();

		render(tarefas, user, tipoUsuario);
	}

	public static void aprovarTarefa(Long id) throws SQLException {
		Tarefa tarefa = Tarefa.find("id", id).first();

		tarefa.setStatus(StatusTarefaEnum.Finalizado);
		tarefa.save();

		tarefasConcluidas();
	}

	public static void cancelarTarefa(Long id) throws SQLException {
		ap.verificarAutenticacao();
		
		String tipoUsuario = ap.checkAdmin();
		String user = ap.usuario();

		render(id, tipoUsuario, user);
	}

	public static void reabrirTarefa(Long id) throws SQLException {
		ap.verificarAutenticacao();
		
		String tipoUsuario = ap.checkAdmin();
		String user = ap.usuario();	
		

		render(id, tipoUsuario, user);
	}

	public static void confirmarReaberturaTarefa(Long id, String descricao) throws SQLException{
		String data = new java.text.SimpleDateFormat(
				"dd/MM/yyyy   HH:mm:ss").format(new java.util.Date());
		
	
		Tarefa tarefa = Tarefa.find("id", id).first();

		tarefa.setStatus(StatusTarefaEnum.Pausado);
		tarefa.setNovaTarefa(true);
		tarefa.save();
		
		LogsTarefa log = new LogsTarefa(descricao, data, 0, 0, tarefa);

		log.save();
		tarefa.save();
		flash.success("Tarefa Reaberta com Sucesso");
		
		tarefasConcluidas();
		
	}
	
	public static void confirmarCancelamentoTarefa(Long id, String descricao) throws SQLException{
		String data = new java.text.SimpleDateFormat(
				"dd/MM/yyyy   HH:mm:ss").format(new java.util.Date());
		
		Tarefa tarefa = Tarefa.find("id", id).first();

		tarefa.setStatus(StatusTarefaEnum.Cancelado);
		tarefa.setNovaTarefa(true);
		tarefa.save();
		
		LogsTarefa log = new LogsTarefa(descricao, data, 0, 0, tarefa);

		log.save();
		tarefa.save();
		flash.success("Tarefa Cancelada com Sucesso");
		
		tarefasConcluidas();
		
	}
	// Lista projetos e suas tarefas em atraso.
	public static void listarProjetos() throws SQLException {
		List<ProjetosTarefasAtraso> projetos = new ArrayList();

		ap.verificarAutenticacao();
		
		String tipoUsuario = ap.checkAdmin();
		String user = ap.usuario();

		ResultSet rs = DB
				.executeQuery("select * from listarProjeto");
		try {
			while (rs.next()) {
				final ProjetosTarefasAtraso p = new ProjetosTarefasAtraso(
						rs.getInt("id"), rs.getString("nomeProjeto"),
						rs.getInt("atrasados"));
				projetos.add(p);
			}
		} finally {
			rs.close();
		}
		render(projetos, tipoUsuario, user);
	}

	public static void tarefasAtraso(long id) throws SQLException {
		List<Tarefa> tarefas = new ArrayList();

		ap.verificarAutenticacao();
		
		String tipoUsuario = ap.checkAdmin();

		Query query = JPA
				.em()
				.createQuery(
						"select t from Tarefa t inner join"
								+ " t.projeto p where t.tempoEstimado < t.tempoTotalTrabalho " +
								"and p.id = "
								+ id);

		tarefas = query.getResultList();

		render(tarefas, tipoUsuario);

	}

	public static void desemprenhoFuncionario() throws SQLException {

		ap.verificarAutenticacao();
		
		String tipoUsuario = ap.checkAdmin();
		String user = ap.usuario();

		ArrayList<desempenhoFunc> desempenho = new ArrayList<desempenhoFunc>();

		ResultSet rs = DB.executeQuery("select * from desempenhoFunc");

		try {
			while (rs.next()) {
				final desempenhoFunc d = new desempenhoFunc(
						rs.getString("nome"), rs.getInt("horasDiarias"),
						rs.getInt("tarefaAtraso"), rs.getInt("tarefaPrazo"));
				desempenho.add(d);
			}
		} catch (DbException e) {
			System.out.println("erro ao conectar ao banco");
		} finally {
			rs.close();
		}

		render(desempenho, tipoUsuario, user);

	}

	public static void andamentoProjetos() throws SQLException {

		ap.verificarAutenticacao();
		String tipoUsuario = ap.checkAdmin();
		String user = ap.usuario();

		List<Projeto> projetos = Projeto.find("order by nomeProjeto desc")
				.fetch();
		render(projetos, user, tipoUsuario);
	}

	public static void listarTarefasFuncionarios() throws SQLException {
		
		ap.verificarAutenticacao();
		String tipoUsuario = ap.checkAdmin();
		String user = ap.usuario();

		List<Tarefa> tarefas = Tarefa.findAll();
		List<Usuario> funcionario = Usuario.find("byTipoUsuario",
				TipoUsuarioEnum.funcionario).fetch();
		List<Projeto> projeto = Projeto.findAll();

		render(tipoUsuario, user, tarefas, funcionario, projeto);
	}

	public static void filtrarTarefas(long func, long proj) throws SQLException {

		ap.verificarAutenticacao();
		
		String user = ap.usuario();
		String tipoUsuario = ap.checkAdmin();
		
		List<Projeto> projeto = Projeto.findAll();
		List<Usuario> funcionario = Usuario.find("byTipoUsuario",
				TipoUsuarioEnum.funcionario).fetch();

		if (func != 0 && proj == 0) {
			List<Tarefa> tarefas = Tarefa.find("byUsuario_id", func).fetch();
			render(tarefas, projeto, funcionario, user, tipoUsuario);
		}

		else if (func == 0 && proj != 0) {
			List<Tarefa> tarefas = Tarefa.find("byProjeto_id", proj).fetch();
			render(tarefas, projeto, funcionario, user, tipoUsuario);
		}

		else if (func != 0 && proj != 0) {
			List<Tarefa> tarefas = Tarefa.find(
					"Usuario_id = ? and Projeto_id = ?", func, proj).fetch();
			render(tarefas, projeto, funcionario, user, tipoUsuario);
		}

		else if (func == 0 && proj == 0) {
			listarTarefasFuncionarios();
		}
	}
	
	public static void tarefasFinalizadasCanceladas(long id) throws SQLException{
		List<Tarefa> tarefas = new ArrayList<Tarefa>();
		String user = session.get("usuario");
		String tipoUsuario = ap.checkAdmin();

		ap.verificarAutenticacao();
		
		
		javax.persistence.Query query = JPA.em().createQuery(
				"select t from Tarefa t inner join " +
				"t.projeto p " +
				"where p.id = '" + id + "'" +
					" order by t.status");
				
		//u.id = t.usuario
		tarefas = query.getResultList();

		render(tarefas, user, tipoUsuario);
	}

}
